<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // reduce :  累加器 
        // 1.数字的累加 
        // var arr = [1, 2, 3, 4, 5];
        // // total ： 上次的累计结果 
        // // item ：循环的键值  
        // // key ： 循环的键名 
        // // arr： 循环的数组
        // // arr.reduce(fucntion(){},初始累加的值);

        // var res = arr.reduce(function (total, item, key, arr) {
        //     console.log(total, item, key, arr);
        //     return total + item;
        // }, 0);
        // console.log(res);


        // 2.数组的累加 
        // var arr = ["a", "a", "c", "a", "a", "b", "b"];

        // // var  res = ["c","b","a"];  // 收集结果的数组  ， 判断 res 里有米有某个值
        // // console.log( res.indexOf("d"));
        // var res = arr.reduce(function (total, item) {
        //     // console.log(total,item);
        //     // console.log(total.indexOf(item));
        //     if (total.indexOf(item) === -1) {
        //         total.push(item);
        //         console.log(total);
        //     }
        //     return total;
        // }, []);  // 初始值 ：收集不重复的内容
        // console.log(res);
        /*
            第一次循环： total --->初始值 []; item = a
                判断  [].indexOf("a") === -1 --->进入判断  --- total -->["a"]
                返还 total = ["a"];
            第二次循环  total -----> ["a"] item = a
               判断  ["a"].indexOf("a")--->0  不等于-1  不进入判断 total--->["a"]
               返还  total = ["a"]
            第三次    total ["a"]  item = c
                判断 ["a"].indexOf("c") ---> -1  进入判断  total.push("c")---> total =  ["a","c"]
                返还 total  = ["a","c"]
                ....

        
        
        
        */


        // 3.对象的累加
        var arr = ["a", "a", "c", "a", "a", "b", "b"];
        // 统计数组里字符出现的次数；
        /* 
        var obj = {
            a:4,
            b:2,
            c:1
        }
        */

        // for 循环实现 统计字符出现的次数；

        // var obj = {};  // 保存结果的空对象 
        // for(var i=0;i<arr.length;i++){
        //     // console.log(arr[i]);
        //     if(!obj[arr[i]]){
        //         // 字符 第一次出现 
        //         obj[arr[i]] = 1;
        //     }else{
        //         obj[arr[i]]++;
        //     }
        // }
        // console.log(obj);


        /*
        第一次循环 ： obj = {};
                    arr[i] = a
                    obj[arr[i]] =  undefined  --> !false --->true
                    obj["a"] = 1; ---->obj = {a:1};

        第二次循环 ： obj = {a:1}
                     arr[1] = a;
                     obj['a'] = 1;  ---> !true  ---false 不进入if判断 进入 else判断  obj["a"]++ ----> obj = {a:2}
        .....
        
        
        
        */


        // reduce循环实现 统计次数

        var res = arr.reduce(function (total, item) {
            // console.log(total[item]);
            if (!total[item]) {
                total[item] = 1;
            } else {
                total[item]++;
            }
            return total;
        }, {});
        console.log(res);


    // Object.prototype.age =20;

    // var obj = {
    //     a:1,
    //     b:2,
    //     c:3
    // }

    // // for in 循环会循环原型链上的内容 ；
    // // 可以判断某个属性是否是对象的自身属性
    // // console.log( obj.hasOwnProperty("age"));
    // for(var key in obj){
    //     if(obj.hasOwnProperty(key)){  // 判断是否是自身属性，如果是 就打印出来
    //          console.log(obj[key]);
    //     }
    // }




    </script>
</body>

</html>